package com.isyscore.config;

import com.isyscore.entity.shrio.CustomRealm;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;
/**
 * ShrioConfig
 *
 * @author gavinluo7@foxmail.com
 */
@Configuration
public class ShrioConfig {
    /**
     * 创建并配置自定义的Realm bean
     * 在Apache Shiro框架中，Realm用于获取安全数据，如用户角色和权限
     * 这个方法定义了一个Bean，名称为realm，它将返回一个CustomRealm实例
     * CustomRealm是自定义的类，实现了Realm接口，用于处理身份验证和授权
     *
     * @return CustomRealm的实例，用于与数据源交互，获取用户角色和权限信息
     */
    @Bean
    public Realm realm() {
        return new CustomRealm();
    }

    /**
     * 配置SecurityManager bean
     * SecurityManager是Shiro框架中的核心安全管理器接口，负责管理应用程序中的所有安全方面
     * 这个方法定义了如何创建和配置SecurityManager实例
     *
     * @param realm 安全领域，用于访问应用程序中定义的用户帐户信息，包括身份验证和授权数据
     *              Realm是Shiro与应用程序特定的安全数据进行交互的接口
     * @return 返回配置好的DefaultWebSecurityManager实例，它是SecurityManager的实现类，
     *         专门为Web应用程序设计
     */
    @Bean
    public DefaultWebSecurityManager securityManager(Realm realm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }
    /**
     * 创建ShiroFilterFactoryBean实例
     *
     * @param securityManager 安全管理器，用于管理Web应用的安全策略
     * @return 返回配置了过滤链的ShiroFilterFactoryBean实例
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // 允许所有请求匿名访问
        filterChainDefinitionMap.put("/**", "anon");
        return shiroFilterFactoryBean;
    }

}
